home *** CD-ROM | disk | FTP | other *** search
/ System Booster / System Booster.iso / Screenblankers / GBlanker / GSource / Blankers / Species / blank.c next >
C/C++ Source or Header  |  1996-09-26  |  3KB  |  139 lines

  1. /*
  2.  *  Copyright (c) 1994 Michael D. Bayne.
  3.  *  All rights reserved.
  4.  *
  5.  *  Please see the documentation accompanying the distribution for distribution
  6.  *  and disclaimer information.
  7.  */
  8.  
  9. #include <exec/memory.h>
  10. #include "/includes.h"
  11.  
  12. UWORD Table4[] = {
  13.     0x0000, 0x0B06, 0x0909, 0x060B,
  14.     0x030E, 0x003E, 0x006B, 0x0099,
  15.     0x00B6, 0x00E3, 0x03E0, 0x06B0,
  16.     0x0990, 0x0B60, 0x0E30, 0x0E03
  17.     };
  18.  
  19. #ifndef min
  20. #define min( x, y ) ( x < y ? x : y )
  21. #endif
  22.  
  23. VOID Defaults( PrefObject *Prefs )
  24. {
  25.     Prefs[0].po_Level = 6;
  26.     Prefs[2].po_ModeID = getTopScreenMode();
  27. }
  28.  
  29. LONG Blank( PrefObject *Prefs )
  30. {
  31.     LONG i, j, hei, wid, size, stable, side, offx, offy;
  32.     LONG *Phase[2] = { 0L, 0L }, Cur = 0, Pos, Species, Parent;
  33.     LONG Width, Height, RetVal = OK;
  34.     struct Screen *Scr;
  35.     struct Window *Wnd;
  36.     
  37.     CurrentTime(( ULONG * )&offx, ( ULONG * )&offy );
  38.  
  39.     Scr = OpenScreenTags( 0L, SA_DisplayID, Prefs[2].po_ModeID, SA_Quiet, TRUE,
  40.                          SA_Overscan, OSCAN_STANDARD, SA_Depth, 4, TAG_DONE );
  41.     if( !Scr )
  42.     {
  43.         RetVal = FAILED;
  44.         goto FAIL;
  45.     }
  46.     
  47.     LoadRGB4( &Scr->ViewPort, Table4, 16 );
  48.     Width = Scr->Width;
  49.     Height = Scr->Height;
  50.     hei = Height / Prefs[0].po_Level;
  51.     wid = Width / Prefs[0].po_Level;
  52.     size = wid * hei;
  53.     side = Height / hei;
  54.     offx = ( Width - side * wid ) / 2;
  55.     offy = ( Height - side * hei ) / 2;
  56.     
  57.     Phase[0] = AllocVec( sizeof( LONG ) * size, MEMF_ANY );
  58.     Phase[1] = AllocVec( sizeof( LONG ) * size, MEMF_ANY );
  59.     
  60.     if( !Phase[0] || !Phase[1] )
  61.     {
  62.         RetVal = FAILED;
  63.         goto FAIL;
  64.     }
  65.  
  66.     Wnd = BlankMousePointer( Scr );
  67.     ScreenToFront( Scr );
  68.         
  69.     while( RetVal == OK )
  70.     {
  71.         for( j = 0; ( j < hei )&&( RetVal == OK ); j++ )
  72.         {
  73.             for( i = 0; i < wid; i++ )
  74.             {
  75.                 Pos = j * hei + i;
  76.                 Phase[1-Cur][Pos] = Phase[Cur][Pos] = RangeRand( 15 ) + 1;
  77.                 SetAPen( &Scr->RastPort, Phase[Cur][Pos] );
  78.                 RectFill( &Scr->RastPort, offx + side * i, offy + side * j,
  79.                          offx + side * i + side - 2,
  80.                          offy + side * j + side - 2 );
  81.                 if(!( Pos % 200 ))
  82.                     if(( RetVal = ContinueBlanking()) != OK )
  83.                         break;
  84.             }
  85.         }    
  86.  
  87.         do
  88.         {
  89.             stable = TRUE;
  90.             CopyMemQuick( Phase[Cur], Phase[1-Cur], size * sizeof( LONG ));
  91.             for( j = 0; ( j < hei )&&( RetVal == OK ); j++ )
  92.             {
  93.                 for( i = 0; i < wid; i++ )
  94.                 {
  95.                     Pos = j * hei + i;
  96.                     Species = Phase[Cur][Pos];
  97.                     if( Species == 15 )
  98.                         Parent = 1;
  99.                     else
  100.                         Parent = Species + 1;
  101.                     if(( Phase[Cur][j*hei+((i+wid-1)%wid)] == Parent )||
  102.                        ( Phase[Cur][j*hei+((i+1)%wid)] == Parent )||
  103.                        ( Phase[Cur][((j+hei-1)%hei)*hei+i] == Parent )||
  104.                        ( Phase[Cur][((j+1)%hei)*hei+i] == Parent ))
  105.                     {
  106.                         SetAPen( &Scr->RastPort, Phase[1-Cur][Pos] = Parent );
  107.                         RectFill( &Scr->RastPort, offx + side * i,
  108.                                  offy + side * j, offx + side * i + side - 2,
  109.                                  offy + side * j + side - 2 );
  110.                         stable = FALSE;
  111.                     }
  112.                     if(!( Pos % 200 ))
  113.                         if(( RetVal = ContinueBlanking()) != OK )
  114.                             break;
  115.                 }
  116.             }
  117.             Cur = 1 - Cur;
  118.         }
  119.         while( !stable &&( RetVal == OK ));
  120.  
  121.         for( i = 0; i < 50 && RetVal == OK; i++ )
  122.         {
  123.             Delay( 2 );
  124.             RetVal = ContinueBlanking();
  125.         }
  126.     }
  127.     UnblankMousePointer( Wnd );
  128.     
  129.  FAIL:
  130.     if( Phase[0] )
  131.         FreeVec( Phase[0] );
  132.     if( Phase[1] )
  133.         FreeVec( Phase[1] );    
  134.     if( Scr )
  135.         CloseScreen( Scr );
  136.  
  137.     return RetVal;
  138. }
  139.